/**
 * iterable(obj)让对象支持for…of
 * @param obj
 */
//方法一：
//给对象的原型添加迭代器
Object.prototype[Symbol.iterator] = function(){
    const keys = Object.keys(this)
    let index = 0
    return {
        next:()=>{
            return{
                value:this[keys[index++]],
                done:index > keys.length
            }
        }
    }
}

//使用：
var obj = { a: 'A', b: 'B', c: 'C' };

for(let value of obj){
    console.log(value)
}





//方法二：
function iterable(obj){
    if(Object.prototype.toString.call(obj) !== "[object Object]"){
        return //非对象，不处理
    }
    if(obj[Symbol.iterator]){
        return //避免重复添加
    }
    const it = Object.create({}, {
        [Symbol.iterator]:  {
            enumerable: false,
            writable: false,
            configurable: true,
            value: function() {
                const _this = this
                //也可使用: keys = Object.getOwnPropertyNames(this)
                const keys = Object.keys(this)
                let index = 0
                return {
                    next(){
                        return {
                            value: _this[keys[index++]],
                            done: index>keys.length
                        }
                    }
                }
            }
        }
    })
    Object.setPrototypeOf(obj, it)
}

//使用：
var myObject = { a: 1, b: 2, c: 3 };

iterable(myObject)// 让myObject可迭代


myObject.d = 4

for(let item of myObject){
    console.log(item)
}
